home *** CD-ROM | disk | FTP | other *** search
- // decsyx: (c) 1996 by Günter Nagler
-
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <ctype.h>
- #include "filei3.hpp"
-
- FILE* f = 0;
- long skip = 5;
- long count = 0;
-
- char* inputname;
- char* outputname;
-
- int main(int argc, char** argv)
- {
- argc--; argv++;
- while (argc > 0 && **argv == '-')
- {
- if (strnicmp(*argv, "-skip", 2) == 0)
- {
- argc--; argv++;
- if (argc == 0 || !isxdigit(**argv))
- fprintf(stderr, "option -skip needs a value\n");
- else
- {
- char* endptr = 0;
-
- skip = strtoul(*argv, &endptr, 0);
- if (endptr && *endptr)
- fprintf(stderr, "%s is not a legal value\n", *argv);
- argc--; argv++;
- }
- continue;
- }
- fprintf(stderr, "invalid option %s\n", *argv);
- argc--; argv++;
- }
-
- if (argc < 2)
- {
- fprintf(stderr, "usage: decsyx [-skip #] inputfile outputfile\n");
- fprintf(stderr, "-skip\tskip sysex header (default: 5)\n");
- return 1;
- }
- inputname = *argv++; argc--;
- outputname = *argv++; argc--;
- FILE* f = fopen(inputname, "rb");
- if (!f)
- {
- perror(inputname);
- return 1;
- }
- if (fgetc(f) != 0xF0)
- {
- fprintf(stderr, "%s does not contain standard sysex dumb\n");
- return 1;
- }
- count = 1;
- int c;
-
- while ((c = fgetc(f)) != EOF && c < 0x80)
- count++;
- if (c != 0xF7)
- {
- fprintf(stderr, "%s does not contain standard sysex dumb\n");
- return 1;
- }
- count -= skip;
- FILE* outf = fopen(outputname, "wb");
- if (!outf)
- {
- perror(outputname);
- return 1;
- }
- fseek(f, skip, SEEK_SET);
- unsigned char dumb[8];
- unsigned char byte[7];
- int d, b;
-
- while (count > 0)
- {
- d = 8;
- if (count < d)
- d = (int)count;
- d = fread(dumb, 1, d, f);
- if (d <= 0)
- {
- fprintf(stderr, "unexpected end of file (file is too short)\n");
- break;
- }
- b = code8to7(dumb, d, byte);
- if (fwrite(byte, b, 1, outf) != 1)
- {
- perror(outputname);
- break;
- }
- count -= d;
- }
-
- fclose(outf);
- fclose(f);
- return 0;
- }
-